//
//  Module.h
//  CocoaSynth
//
//  Created by Jérémy Brault on 17/02/10.
//  Copyright 2010 None. All rights reserved.
//

#import <Cocoa/Cocoa.h>

#import "PortInProtocol.h"
#import "SampleProtocol.h"

/*!
    @class       Module 
    @superclass  NSObject
    @abstract    La classe module est une classe abstraite. Un module est l'element central de la partie metier.
				 Un module est une unite de transformation et de generation de signal.
    @discussion  Un module recoit un echantillon de signal en entree, le transforme
				 puis depose le resultat dans ses ports de sortie correspondant.
*/
@interface Module : NSObject {
	// Le port d'entree par defaut
	id<PortInProtocol> portIn;
	// Les port de sortie
	NSMutableArray* portsOut;
	// Donnee d'entree
	id<SampleProtocol> inputSample;
}

@property (nonatomic, retain) id<PortInProtocol> portIn;
@property (nonatomic, retain) NSMutableArray* portsOut;
@property (nonatomic, retain) id<SampleProtocol> inputSample;

/*!
    @method     read
    @abstract   Phase de lecture des donnees du port d'entree.
    @discussion Le but est de demander au port d'entree les donnes calcule par le module branche sur le port in
*/
- (void)read;

/*!
    @method     compute
    @abstract   Phase de calcul, le module demande a ses port out de calcule, en fonction de leur type,
				une transformation sur l'echantillon.
*/
- (void)compute;

/*!
    @method     stop
    @abstract   Previens le module de l'arret du sequenceur.
*/
- (void)stop;

/*!
    @method     addPortOut:
    @abstract   Ajoute un port de sortie au module
    @param      aPortOut Le port ajoute
*/
- (void)addPortOut:(id<PortOutProtocol>)aPortOut;

/*!
    @method     removePortOut:
    @abstract   Supprime un port de sortie
    @param      aPortOut Le port supprime
*/
- (void)removePortOut:(id<PortOutProtocol>)aPortOut;

@end
